



/*
 * **********************************************************
 * include files
 * **********************************************************
 */
 
#include "main.h"
#include "Register.h"
#include "uart.h"	
#include "EEPROM.h"
#include "ModbusRtu.h"
#include "ModbusRegister.h"
#include "IDriver.h"
#include "Timer.h"
#include "Control.h"

/****************Include  Section  Begin***************************************************/


/****************Struct Definition Section Begin*********************************************/
#define F_NUM (9)

extern u8 DoubleFanSaveEnergyFlag;
extern u8	Set_Modbus_Address(	u8 index	,	u8	address	);
extern s16 ModbusRTUMaster_SlaveComFault(void);
extern u8 TempDefrostProgress;  
extern u8 StopSecond;
extern u16 StopMinute; 
extern u16 RunMinute; 
extern u16 DefRunRunMinute; 

typedef struct
{
	int16_t min;
	int16_t max;
	int16_t delta;
	int16_t decimal; 
} PARAM_LIMIT;



//s16 *Param_Values;
s16 Param_Values[PARAM_AMOUNT];


/*
 * Function Name:	ParameterLimit
 * Description:	������
 * Note:	����ΪPARAM_AMOUNT�Ķ���,����Flash��,ȫ����Ĭ��ֵ
 */
const PARAM_LIMIT	ParameterLimit[PARAM_AMOUNT] =
{
//	��Сֵ	���ֵ	   Ĭ��	   	   ��ַ	 ����
	{-400, -50, 10, 1},    // 0  //  �趨�����¶� Tset
  {5, 100, 5, 1},    // 1  //  �����¶���ƫ�� deltaT
  {5, 100, 5, 1},    // 2 //  �����¶��趨��ƫ��
  {-90, 1000, 1, 2},    // 3  //  ѹ����ֹͣ, ����ѹ����������
  {15, 60, 1, 0},    // 4  //  ѹ������ʼת��
  {15, 50, 1, 0},    // 5  //  ѹ����������Сת��
  {20, 100, 1, 0},    // 6  //  ѹ�����������ת��
  {2, 120, 1, 0},    // 7  //  ��ʼ��ʱ�䣬30s
  {0,  600, 1, 0},    // 8  //  ����ǰ��ʱ
  {1, 900, 1, 0},    // 9  //  Ƶ�ʵ�ͣ����ʱ
	{1,  900, 1, 0},    // 10  //  ����ѹ����ͣ����ʱ
  {1,  600, 1, 0},    // 11  //  ����ʱ��Ƶ��������
  {1,  600, 1, 0},    // 12  //  ������Ƶ��������
  {1,  600, 1, 0},    // 13  //  ����ʱ��Ƶ��������
  {1,  600, 1, 0},    // 14  //  ���ټ�Ƶ��������СƵ��ͣ����ʱ
  {25,  80, 1, 0},    // 15  //  ǿ�Ƽ�ƵƵ������
  {100,  900, 1, 1},    // 16  //  ��������¶�
  {1,  400, 1, 1},    // 17  //  ���������ƫ������¶ȣ�
  {10, 50, 1, 1},    // 18  //  Pd/Ps < N1, ����5���ӣ�����Ƶ�ʣ�3Hz/s, 1λС��
  {10, 50, 1, 1},    // 19  //  N1<= Pd/Ps < N2, ����Ƶ�ʣ���ֹƵ�ʼ��٣� 1λС��
                                           //  N2 <= Pd/Ps��Ƶ���������ƣ� 1λС��                                    
  {0, 995, 5, 1},    // 20  //  ����ѹ����ǿ��ͣ��, 1λС��
  {0, 995, 5, 1},    // 21  //  ����ѹ����ǿ�ƽ�Ƶ��1λС��
  {0, 995, 5, 1},    // 22  //  ����ѹ���߽�ֹ��Ƶ��1λС��
  {0, 995, 5, 1},    // 23  //  ����ѹ����������Ƶ��1λС��
  {1,  100, 1, 0},    // 24  //  1�β������ǿ��ͣ��������
  {1,  100, 1, 0},    // 25  //  1�β������ǿ�ƽ�Ƶ������
  {1,  100, 1, 0},    // 26  //  1�β�����߽�ֹ��Ƶ������
  {1,  100, 1, 0},    // 27  //  1�β������������Ƶ������
  {10,  1000, 1, 1},    // 28  //  2�β������ǿ��ͣ����1λС��
  {10,  1000, 1, 1},    // 29  //  2�β������ǿ�ƽ�Ƶ��1λС��
  {10,  1000, 1, 1},    // 30  //  2�β�����߽�ֹ��Ƶ��1λС��
  {10,  1000, 1, 1},    // 31  //  2�β������������Ƶ��1λС��
  {80, 150, 1, 0},    // 32  //  �����¶ȸ�ǿ��ͣ��������
  {80, 150, 1, 0},    // 33  //  �����¶ȸ�ǿ�ƽ�Ƶ������
  {80, 150, 1, 0},    // 34  //  �����¶ȸ߽�ֹ��Ƶ������
  {80, 150, 1, 0},    // 35  //  �����¶ȸ�������Ƶ������
  {30, 150, 1, 0},    // 36  //  IPM�¶ȸ�ǿ��ͣ��������
  {30, 150, 1, 0},    // 37  //  IPM�¶ȸ�ǿ�ƽ�Ƶ������
  {30, 150, 1, 0},    // 38  //  IPM�¶ȸ߽�ֹ��Ƶ������
  {30, 150, 1, 0},    // 39  //  IPM�¶ȸ�������Ƶ������
  {-90, 1000, 1, 2},    // 40  //  ����ѹ����ǿ��ͣ����1λС��
  {0, 999, 1, 0},    // 41  //  ������С�������
  {0, 999, 1, 0},    // 42  //  ͣ������ʱ����  
  {-500, 999, 1, 1},    // 43  //  �����¶ȵͱ���
  {0,  999, 1, 0},    // 44  //  �����¶ȵͱ�����ʱ
  {-90,  2000, 1, 2},    // 45  //  ����ѹ���߱���
  {1,  600, 1, 1},    // 46  //  ����ѹ���߱�����ʱ������0.1����
  {15,  60, 1, 0},    // 47  //  �Զ����ʹ���Ƶ��
  {3,  360, 1, 0},    // 48  //  �Զ����ʹ���ʱ�䣬����
  {30,  600, 1, 0},    // 49  //  �Զ����Ͷ���ʱ��
  {15,  100, 1, 0},    // 50  //  �Զ����Ͷ���Ƶ��
  {20,  300, 1, 0},    // 51  //  ���͸����趨Ƶ�ʳ�����������ȡ��ʱ���ۼ�
  {20,  90, 1, 0},    // 52  //  ���͸��ڴ�Ƶ�ʳ����趨������ȡ��ʱ���ۼ�
  {0,  1, 1, 0},    // 53  //  ����ģʽ
  {0,  120, 1, 0},    // 54  //  ����ѹ����ת��
  {0,  120, 1, 0},    // 55  //  ���Է��1ת��
  {0,  120, 1, 0},    // 56  //  ���Է��2ת��
  {0,  1, 1, 0},    // 57  //  ѹ����PID�㷨ʹ��
  {0, 999, 1, 2},    // 58   //  ѹ����PID��Pֵ
  {0, 999, 1, 2},    // 59   //  ѹ����PID��Iֵ
  {0, 999, 1, 2},    // 60   //  ѹ����PID��Dֵ
  {1,  900, 1, 0},    // 61  //  ѹ����PID�ļ�������

  {0,  150, 1, 0},    // 62  // ��Һ�������¶ȣ�����
  {0,  200, 1, 0},    // 63  //  ��Ƶ��PFCд�����
  {1,  150, 1, 1},    // 64  //  ��Ƶ������ƵĬ������

  {0,  120, 1, 0},    // 65  //  ����Ƶ�����ֵ
  {1,  30, 1, 0},    // 66  //  ����Ƶ�ο���

  {0,  1, 1, 0},    // 67  //  ����ģʽ�趨
  {-200,  200, 10, 1},    // 68  //  ����ģʽ�¶��趨
  {-200,  200, 5, 1},    // 69  //  ����ģʽ�¶��趨ƫ��
  {0,  300, 1, 0},    // 70  //  ����ģʽ��ʱ
  {-500,  500, 5, 1},    // 71  //  ����ģʽ�����¶��趨ƫ��
  {-500, 500, 1, 2},    // 72  //  ����ģʽѹ����ͣ��ƫ��

  {0, 3, 1, 0},    // 73  //  0��9600��1��19200��2��57600��3��115200
  {0, 2, 1, 0},    // 74  //  У��λ
  {1, 2, 1, 0},    // 75  //  ֹͣλ
  {1, 245, 1, 0},    // 76  //  ������ַ

  {2,  80, 1, 0},    // 77  //  Ƶ�ʵ��ڵȴ�����
  {2,  900, 1, 0},    // 78  //  Ƶ�ʵ��ڵȴ�����
  {0, 999, 1, 2},    // 79  //  ���PID��Pֵ
  {0, 999, 1, 2},    // 80  //  ���PID��Iֵ
  {0, 999, 1, 2},    // 81  //  ���PID��Dֵ
  {1, 900, 1, 0},    // 82  //  ���PID�ļ�������

  {5,  120, 1, 0},    // 83  // �����СƵ��,10rpm
  {10,  120, 1, 0},    // 84  // ������Ƶ��,10rpm

  {80,  150, 1, 0},    // 85
  {0,  90, 1, 0},    // 86
  {0,  300, 1, 0},    // 87
  {80,  150, 1, 0},    // 88
  {80,  150, 1, 0},    // 89

  {80,  150, 1, 0},    // 90
  {0,  10, 1, 0},    // 91
  {0,  500, 1, 0},    // 92
  {0,  500, 1, 0},    // 93
  {0,  500, 1, 0},    // 94
  {0,  500, 1, 0},    // 95
  {-32768,  32767, 1, 0},    // 96
  {-1,  22000, 1, 21930},    // 97  //  ����־
  {-32768,  32767, 1, 0},    // 98  //  �ϴβ���ֵ
  {-32768,  32767, 1, 0},    // 99
	{0,  120, 1, 0},    // 100
	{0,  120, 1, 0},    // 101
	{0,  120, 1, 0},    // 102
	{0,  120, 1, 0},    // 103
	{0,  120, 1, 0},    // 104
	{0,  1000, 1, 0},		// 105
	{0,  120, 1, 0},    // 106
	{0,  120, 1, 0},    // 107
	{0,  120, 1, 0},    // 108
	{0,  3600, 1, 0},		// 109
	{0,  120, 1, 0},			// 110
	{-10, 50, 1, 1},	//111
	{0,	60, 1, 1}	//112 
};

const int16_t EEPROM_DefValue[PARAMETER_DEFAULT_COUNT]=
{
  -100, // 0  //  �趨�����¶� Tset
  50, // 1  //  �����¶���ƫ�� deltaT
  50, // 2 //  �����¶��趨��ƫ��
  200, // 3  //  ѹ����ֹͣ, ����ѹ����������
  25, // 4  //  ѹ������ʼת��
  25, // 5  //  ѹ����������Сת��
  90, // 6  //  ѹ�����������ת��
  40, // 7  //  ��ʼ��ʱ�䣬30s
  5, // 8  //  ����ǰ��ʱ
  180, // 9  //  ��СƵ��ͣ����ʱ
  30, // 10  //  ����ѹ����ͣ����ʱ
  2, // 11  //  ����ʱ��Ƶ��������
  6, // 12  //  ������Ƶ��������
  2, // 13  //  ����ʱ��Ƶ��������
  2, // 14  //  ���ټ�Ƶ��������
  35, // 15  //  ǿ�Ƽ�ƵƵ������
  350, // 16  //  ��������¶�
  50, // 17  //  ���������ƫ������¶ȣ�
  20, // 18  //  Pd/Ps < N1, ����5���ӣ�����Ƶ�ʣ�3Hz/s, 1λС��
  25, // 19  //  N1<= Pd/Ps < N2, ����Ƶ�ʣ���ֹƵ�ʼ��٣� 1λС�� //  N2 <= Pd/Ps��Ƶ���������ƣ� 1λС��
  390, // 20  //  ����ѹ����ǿ��ͣ��, 1λС��
  370, // 21  //  ����ѹ����ǿ�ƽ�Ƶ��1λС��
  360, // 22  //  ����ѹ���߽�ֹ��Ƶ��1λС��
  330, // 23  //  ����ѹ����������Ƶ��1λС��
  33, // 24  //  1�β������ǿ��ͣ��������
  30, // 25  //  1�β������ǿ�ƽ�Ƶ������
  28, // 26  //  1�β�����߽�ֹ��Ƶ������
  26, // 27  //  1�β������������Ƶ������
  143, // 28  //  2�β������ǿ��ͣ��������
  133, // 29  //  2�β������ǿ�ƽ�Ƶ������
  123, // 30  //  2�β�����߽�ֹ��Ƶ������
  113, // 31  //  2�β������������Ƶ������
  118, // 32  //  �����¶ȸ�ǿ��ͣ��������
  110, // 33  //  �����¶ȸ�ǿ�ƽ�Ƶ������
  108, // 34  //  �����¶ȸ߽�ֹ��Ƶ������
  102, // 35  //  �����¶ȸ�������Ƶ������
  105, // 36  //  IPM�¶ȸ�ǿ��ͣ��������
  100, // 37  //  IPM�¶ȸ�ǿ�ƽ�Ƶ������
  95, // 38  //  IPM�¶ȸ߽�ֹ��Ƶ������
  90, // 39  //  IPM�¶ȸ�������Ƶ������
  50, // 40  //  ����ѹ����ǿ��ͣ����1λС��
  240, // 41  //  ������С�������
  180, // 42  //  ͣ������ʱ����  
  0, // 43  //  �����¶ȵͱ���
  300, // 44  //  �����¶ȵͱ�����ʱ
  580, // 45  //  ����ѹ���߱���
  200, // 46  //  ����ѹ���߱�����ʱ������0.1����
  43, // 47  //  �Զ����ʹ���Ƶ��
  90, // 48  //  �Զ����ʹ���ʱ�䣬����
  120, // 49  //  �Զ����Ͷ���ʱ��
  50, // 50  //  �Զ����Ͷ���Ƶ��
  120, // 51  //  ���͸����趨Ƶ�ʳ�����������ȡ��ʱ���ۼ�
  45, // 52  //  ���͸��ڴ�Ƶ�ʳ����趨������ȡ��ʱ���ۼ�
  0, // 53  //  ����ģʽ
  0, // 54  //  ����ѹ����ת��
  0, // 55  //  ���Է��1ת��
  0, // 56  //  ���Է��2ת��
  1, // 57  //  ѹ����PID�㷨ʹ��
  10, // 58  //  ѹ����PID��Pֵ
  2, // 59  //  ѹ����PID��Iֵ
  10, // 60  //  ѹ����PID��Dֵ
  1, // 61  //  ѹ����PID�ļ�������
  90, // 62  //  ��Һ�������¶ȣ�����
  50, // 63  //  ��Ƶ��PFCд�����
  10, // 64  //  ��Ƶ������ƵĬ������
  0, // 65  //  ����Ƶ�����ֵ
  1, // 66  //  ����Ƶ�ο���
  1, // 67  //  ����ģʽ�趨
  -50, // 68  //  ����ģʽ�¶��趨
  50, // 69  //  ����ģʽ�¶��趨ƫ��
  120, // 70  //  ����ģʽ��ʱ
  -150, // 71  //  ����ģʽ�����¶��趨ƫ��
  -140, // 72  //  ����ģʽѹ����ͣ��ƫ��
  0, // 73  //  0��9600��1��19200��2��57600��3��115200
  0, // 74  //  У��λ
  2, // 75  //  ֹͣλ
  1, // 76  //  ������ַ
  80, // 77  //  Ƶ�ʵ��ڵȴ�����
  2, // 78  //  Ƶ�ʵ��ڵȴ�����
  20, // 79  //  ���PID��Pֵ
  1, // 80  //  ���PID��Iֵ
  0, // 81  //  ���PID��Dֵ
  1, // 82  //  ���PID�ļ�������
  15, // 83  // �����СƵ��,10rpm
  78, // 84  // ������Ƶ��,10rpm
  95,  // 85
  30,  // 86
  30,  // 87
  85,  // 88
  108,  // 89
  104,  // 90
  8,  // 91
  350,  // 92
  250,  // 93
  150,  // 94
  0,  // 95
  1,  // 96
  1, // 97  //  ����־
  2, // 98  //  �ϴβ���ֵ Ĭ��6P
  1,  // 99
	1, //100
	1, //101
	1, //102
	1, //103
	1, //104
	0, //105
	40, //106
	70, //107
	120, //108
	300, //109
	120,	//110
	0, //111
	10 //112
};


/*
 * Function Name:   Params_Get_Stored_Value
 * Description: 
 * Return Value:    s16
 * Parameter:   index
 * Note:
 */
s16 Params_Get_Stored_Value(    u16 index   )
{
	if(index < PARAM_AMOUNT)
	{   
		return Param_Values[index];
	}
	else
	{
		return ILoad_Stored_Value(index);
	}
}


/*
 * Function Name:	Param_Get_MAX
 * Description:
 * Return Value:	s16
 * Parameter:	index
 * Note:
 */
s16	Param_Get_MAX(	u16	index	)
{
	if(index < PARAM_AMOUNT)
	{
		return ParameterLimit[index].max;         
	}
	else
	{
		return (s16)32767;
	}
}

/*
 * Function Name:	Param_Get_MIN
 * Description:
 * Return Value:	s16
 * Parameter:	index
 * Note:
 */
s16	Param_Get_MIN(	u16	index	)
{
	if(index < PARAM_AMOUNT)
	{           
		return ParameterLimit[index].min;

	}
	else
	{
		return (s16)-32768;
		
	}
}


int16_t	Param_Get_Delta(	u16	index	)
{
	if(index < PARAM_AMOUNT)
	{
     return ParameterLimit[index].delta;
	}
	else
	{
		return (s16)-32768;
	}
}


int16_t	Param_Get_Decimal(	u16	index	)
{
	if(index < PARAM_AMOUNT)
	{
    return ParameterLimit[index].decimal;
		
	}
	else
	{
		return (s16)-32768;
		
	}
}
/*
 * Function Name:	Param_Get_Default
 * Description:
 * Return Value:	s16
 * Parameter:	index
 * Note:
 */
s16	Param_Get_Default(	u16	index	)
{
	if(index < PARAM_AMOUNT)
	{   
		return EEPROM_DefValue[index];      
	}
	else
	{
		return (s16)0;
	}
}

/*
 * Function Name:	Param_Check_Value
 * Description:
 * Return Value:	u8
 * Parameter:	location
 * 				value
 * Note:
 */
u8	Param_Check_Value(	u16	index	,	s16	value)
{
	if(value > Param_Get_MAX(index))
	{
		return (u8)1;
	}
	else if(value < Param_Get_MIN(index))
	{
		return (u8)2;
	}
	else
	{
		return (u8)0;
	}
}

void Params_Set_dafault(void)
{
	int i,j;
	for (i = 0; i < PARAM_AMOUNT; i++)
	{
		j = i * 2;
		IStore_Value(j, Param_Get_Default(i));
		SetJDASDParamValue(i, ILoad_Stored_Value(j));
	}
}


/*
 * Function Name:	Params_Init_By_Stored
 * Description:
 * Return Value:	u8
 * Parameter:	?
 * Note:
 */
u8	Params_Init_By_Stored(	void	)
{
	u16	i, j;
	int16_t TempValue;
	u8	flag = 0;

	TempValue = ILoad_Stored_Value(HREG_PARAM_VERSION * 2);
	if(TempValue != PARAMETER_VERSION) 
	{
		TempValue = ILoad_Stored_Value(HREG_PARAM_VERSION * 2);
		if(TempValue != PARAMETER_VERSION) 
		{
			flag = 1;			
		}
	}

	for (i = 0; i < PARAM_AMOUNT; i++)
	{
		j = i * 2;						     

		switch(i)
		{
			case	HREG_FACTORY_TEST_FLAG:

			if(flag == 1)
			{
				TempValue = ILoad_Stored_Value(j);
				if ((TempValue != 0) && (TempValue != FACTORY_TEST_TAG) && (TempValue != (int16_t)0xFFFF))
				{
					IStore_Value(j, FACTORY_TEST_TAG);   
					SetJDASDParamValue(i, FACTORY_TEST_TAG);
				}
				else
				{
					SetJDASDParamValue(i, ILoad_Stored_Value(j));		
					
				}
			}
			else
			{
				SetJDASDParamValue(i, ILoad_Stored_Value(j));																

			}
			break;

			case	HREG_TEST_FLAG:
			case	HREG_TEST_SPEED:
			case	HREG_TEST_FAN1_SPEED:
			case	HREG_TEST_FAN2_SPEED:
				IStore_Value(j, Param_Get_Default(i));   
				SetJDASDParamValue(i, ILoad_Stored_Value(j));
				break;

			default:                   

			if(Param_Check_Value(i, ILoad_Stored_Value(j)) || flag)
			{
				IStore_Value(j, Param_Get_Default(i));
			}

			if (ILoad_Stored_Value(j) > Param_Get_MAX(i))
			{
				IStore_Value(j, Param_Get_MAX(i));

			}
			else if (ILoad_Stored_Value(j) < Param_Get_MIN(i))
			{
				IStore_Value(j, Param_Get_MIN(i));

			}
			SetJDASDParamValue(i, ILoad_Stored_Value(j));
			//IWDG_Feed();
			break;
		}
	}
		
	if(flag == 1)
	{
		IStore_Value(HREG_PARAM_VERSION * 2, PARAMETER_VERSION); 
	}				
	return (u8)0;
							
}


/*
 * Function Name:   GetJDDSCParamValue
 * Description:
 * Return Value:    s16 
 * Parameter:   index
 * Note:
 */

s16 GetJDASDParamValue( u16 Address )
{   
	if(Address >= PARAM_AMOUNT)
	{
		return 0;
	}
	else
	{				
		return  Param_Values[Address];	        
	}
}


/*
 * Function Name:   SetOtherParamValue
 * Description:
 * Return Value:    
 * Parameter:   index
 * Note:
 */
u8 SetOtherParamValue( u16 Address  ,   s16 Value   )
{
	return 0;
}


/*
 * Function Name:   GetOtherParamValue
 * Description:
 * Return Value:    
 * Parameter:   index
 * Note:
 */

s16 GetOtherParamValue( u16 Address )
{   
	return 32000;    
}
/*
 * Function Name:   GetParamDec
 * Description:
 * Return Value:    
 * Parameter:   index 
 * Note:
 */
u8 GetParamDec(u16 index)
{
  if (index >= PARAM_AMOUNT)
    return 0;
  else
    return ParameterLimit[index].decimal;
}

/*
 * Function Name:   SetParamValue
 * Description:
 * Return Value:    s16
 * Parameter:   index
 * Note:
 */
void SetParamValue( u16 Address ,s16 Value)
{
    if(Address >= PARAM_AMOUNT)
    {
        return ;
    }
    else if(Address < PARAM_AMOUNT)
    {
        Param_Values[Address] = Value;
    }

}

